/// 极兔公司的报价
part of "../../factory.dart";

class JituShippingService implements ShippingService {
  /// 由于每家公司的报价方式不同，因此可能需要的规则不同
  /// 但总体来说，使用csv会比较清楚
  @override
  double calcPrice(String province, double weightKg) {
    // 全国共有31个省份
    assert(standards.length == 31);

    // 3. 根据用户的输入，获得省份和重量
    if (!standards.containsKey(province)) throw Bug("没有找到省份$province的收费标准");
    final FeeStandard standard = standards[province]!;

    // 根据重量，获取报价
    // 其中3kg以下为一口价，3kg以上为首重+续重的公式
    double price;
    if (weightKg <= 0.5) {
      price = standard.zeroToHalf;
    } else if (weightKg <= 1) {
      price = standard.halfToOne;
    } else if (weightKg <= 2) {
      price = standard.oneToTwo;
    } else if (weightKg <= 3) {
      price = standard.twoToThree;
    } else if (weightKg <= 20) {
      // 比如3.5kg，那么就按4kg算，首重为1kg，所以续重恰好为取整部分，也就是3kg
      price = standard.firstKg + (weightKg.floor() * standard.afterKg);
    } else {
      // 物流商无法提供服务
      throw Bug("重量超过20kg，极兔无法提供服务");
    }

    return price;
  }
}

class FeeStandard {
  /// 0-0.5kg的一口价
  final double zeroToHalf;

  /// 0.5-1kg的一口价
  final double halfToOne;

  /// 1-2kg的一口价
  final double oneToTwo;

  /// 2-3kg的一口价
  final double twoToThree;

  /// 首重（超过3kg时，就需要按首重和续重的方式来计算快递费）
  final double firstKg;

  /// 续重（适用于1-20kg）
  final double afterKg;

  const FeeStandard(
    this.zeroToHalf,
    this.halfToOne,
    this.oneToTwo,
    this.twoToThree,
    this.firstKg,
    this.afterKg,
  );
}
